<?php

namespace app\modules\backend\controllers;

use app\models\tableModel\PositionDataModel;
use app\service\tool\UtilsService;
use \yii\console\Exception as consoleException;
use app\models\tableModel\PositionModel;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;

/**
 * 推荐位附属数据管理
 * User: Administrator
 * Date: 2022/01/10
 * Time: 19:55:06
*/
class PositionDataController extends BaseController
{

    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'verbs' => [ // 请求方式
                'class' => VerbFilter::className(),
                'actions' => [
                    ### 页面
                    'index-page' => ['GET'],
                    ### 接口
                    'setting' => ['GET'],
                    'list' => ['GET'],
                    'delete' => ['POST'],
                    'sort' => ['POST'],
                    'push' => ['POST'],
                ],
            ]
        ];
    }


    /**
     * 列表页面
     * @return mixed
     */
    public function actionIndexPage()
    {

        return $this->render('index', []);
    }


    /**
     * 获取设置
     *  ` PS: 获取某些设置(如：状态列表等)以供前端使用
     * @return mixed
     */
    public function actionSetting()
    {

        // 类型 - 一般为首页[index]、表单[form]
        $type = $this->get('type');
        // 模型
        $model = PositionDataModel::loadModel();
        return $this->jsonSuccess('成功', [
            'from_type_list' => $model::getFromTypeList(), // 来源类型列表值
            'min_sort' => $model::getMinSort(), // 最小排序值
            'max_sort' => $model::getMaxSort(), // 最大排序值
        ]);
    }

    /**
     * 列表
     * @return \yii\console\Response|\yii\web\Response
     * @throws consoleException
     */
    public function actionList()
    {

        // 查询内容
        $search = $this->get('search');
        // 显示当前第几页
        $page = $this->get('page', 1, 'int');
        // 每页显示多少条
        $pageSize = $this->getPageSize();
        // 排序字段
        $sort = $this->getSort();

        // 字段1
        $field = [
            'id',
            'pos_id',
            'from_id',
            'data',
            'from_type',
            'sort',
            'add_time',
            'update_time',
        ];

        // 父级别[model]
        $model = PositionDataModel::loadModel();

        // 数据列表
        $paginate = $model->loadWhere($search)->loadSort($sort)->getPaginate($page, $pageSize, $field);

        return $this->jsonSuccess('成功', [
            'total' => $paginate->getTotal(),
            'list' => $paginate->getList()
        ]);
    }

    /**
     * 禁用条目
     * @param array $idList 数据条目|多条数组格式，如：[1,2,3]
     * @return mixed
     */
    public function actionDelete()
    {

        // 编号列表获取
        $idList = $this->post('idList');
        // 不是数组塑造下 为了构成100%的数组
        if (!empty($idList) && !is_array($idList)) $idList = explode(',', $idList);
        // 看获取的编号列表是否合法
        if (empty($idList) || count($idList) <= 0) {

            return $this->jsonFail('请选择一个条目', 400, [
                'hint' => '未传输任何编号'
            ]);
        }

        // 检测多选条目
        $maxIdCount = $this->getMaxIdCount();
        if (count($idList) > intval($maxIdCount)) {
            return $this->jsonFail('每次最多选择操作' . $maxIdCount . '条数据', 400);
        }

        // 条件
        $condition = ['AND', ['IN', 'id', $idList]];
        // 修改的字段
//        $field = ['status' => PositionDataModel::getStatusDisabled()];
        // 是否操作成功 - 错误一般记录到[log]日志
        if (!PositionDataModel::deleteAll($condition)) {

            // 将返回数据库级错误，暂不返回 会在日志中记录
            return $this->jsonFail('请求频繁请稍后尝试', 500, [
                'err_detail' => '出现致命错误。请查看日志',
                'err_code' => 500
            ]);
        }

        return $this->jsonSuccess('成功');
    }

    /**
    * 排序
    * @param array $idList 数据条目|多条数组格式，如：[1,2,3]
    * @return mixed
    */
    public function actionSort()
    {

        // 编号列表获取
        $idList = $this->post('idList');
        // 不是数组塑造下 为了构成100%的数组
        if (!empty($idList) && !is_array($idList)) $idList = explode(',', $idList);
        // 看获取的编号列表是否合法
        if (empty($idList) || count($idList) <= 0) {

            return $this->jsonFail('编号不能为空', 400);
        }

        // 检测多选条目
        $maxIdCount = $this->getMaxIdCount();
        if (count($idList) > intval($maxIdCount)) {
            return $this->jsonFail('每次最多选择操作' . $maxIdCount . '条数据', 400);
        }

        // 排序值获取
        $sort = $this->post('sort', 0);
        // 看获取的[data]是否为空
        if (!isset($sort)) return $this->jsonFail('排序不能为空', 400);

        // 排序不得超过
        if ($sort > PositionDataModel::getMaxSort()) {
            return $this->jsonFail('排序不得超过' . PositionDataModel::getMaxSort(), 400);
        }
        // 排序小于
        if ($sort > PositionDataModel::getMinSort()) {
            return $this->jsonFail('排序不得小于' . PositionDataModel::getMinSort(), 400);
        }

        // 条件
        $condition = ['AND', ['IN', 'id', $idList]];
        // 修改的字段
        $field = ['sort' => $sort];
        if (!PositionDataModel::updateField($condition, $field)) {

            $error = UtilsService::getModelError(PositionModel::getStaticErrors());
            // 将返回数据库级错误，暂不返回 会在日志中记录
            return $this->jsonFail($error['msg'], $error['column'] == 'unknown' ? 500 : 400);
        }

        return $this->jsonSuccess('成功');
    }

    /**
     * 推送
     * @return mixed
     */
    public function actionPush()
    {

        ### 来源编号列表
        $fromIdList = $this->post('fromIdList');
        // 强制数组
        if (!is_array($fromIdList)) $fromIdList = array_filter(explode(',', $fromIdList));
        // 不存在
        if (!$fromIdList || count($fromIdList) < 1) {
            return $this->jsonFail('来源数据不存在', 400, [
                'error_hint' => '请传输来源数据信息'
            ]);
        }

        ### 来源类型
        $fromType = $this->post('fromType');
        $typeList = array_column(PositionModel::getTypeList(), 'value');
        if (!in_array($fromType, $typeList)) {
            return $this->jsonFail('来源类型不存在', 400, [
                'error_hint' => '来源类型非法'
            ]);
        }

        ### 推荐位主编号列表
        $posIdList = $this->post('posIdList');
        // 强制数组
        if (!is_array($posIdList)) $posIdList = array_filter(explode(',', $posIdList));
        // 不存在
        if (!$posIdList || count($posIdList) < 1) {
            return $this->jsonFail('请选择推荐位', 400, [
                'error_hint' => '推荐位编号不存在'
            ]);
        }

        ### 循环来源编号操作条目
        // 循环以推荐位编号列表
        foreach ($posIdList as $kp => $vp) {

            // 初始化
            $posDataModel = false;
            $posModel = PositionModel::loadModel($vp);
            if (!$posModel) {
                return $this->jsonFail('推荐位置不存在，请重刷新推荐位', 400);
            }
            if (!$posDataModel['status'] != PositionModel::getStatusOpen()) {
                return $this->jsonFail('推荐位禁用，请重刷新推荐位', 400);
            }

            if (!$posModel->savePosData($vp, $fromIdList, $fromType)) {

                $error = UtilsService::getModelError($posModel->errors);
                // 此处先[400]错误都提醒出来
                return $this->jsonFail($error['msg'], 400, [
                    'error_hint' => $error['msg']
                ]);
            }
        }

        // 成功
        return $this->jsonSuccess('成功');
    }
}
